<?php
/**
 * @brief Klasa encyjna Auction
 * 
 * Obiekty tej klasy są reprezentacją aukcji. Z każdą aukcją powiązane jest wiele
 * ofert. Jedna z nich - oferta wyjściowa, jest nieodłączną częscią aukcji. Ma
 * to odzwierciedlenie w tej klasie. Aukcje wystepują w dwóch formach:
 * - Z ukrytymi ofertami, przed koncem aukcji.
 * - Z jawnymi ofertami w czasie aukcji.
 * 
 */
class Application_Model_Auction
{

    protected $_Auction_id; /*!< Identyfikator aukcji. */
    protected $_MarketEntity_id; /*!< Nazwa uzytkownika zakładającego aukcję. */
    protected $_title;  /*!< Tytuł aukcji. */
    protected $_description; /*!< Opis aukcji. */
    protected $_startTime; /*!< Poczatek aukcji. */
    protected $_endTime; /*!< Koniec aukcji. */
    protected $_hiddenOffers; /*!< Meta-informacja o widoczności ofert (przed końcem aukcji). */
    
    protected $_StartingOffer; /*!< Oferta wyjściowa. */
    protected $_Offers; /*!< Oferty pozostałe. */
    
    protected $_isVisible; /*!< Metainforma informujaca czy wyniki zostaly zapisane w bazie danych */
    protected $_duration; /*!< Czas trwania aukcji w dniach. */
    


    
    /**
     * @brief Konstruktor 
     * 
     * Przyjmuje tablicę znaków i na jej podstawie uzupełnia pola,
     * przy pomocy setOptions.
     * @param array $options 
     */
    public function __construct(array $options = null) {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

    /**
     * @brief Metoda uzupełniająca pola na podstawie wejściowej tablicy.
     * 
     * @param array $options
     * @return Application_Model_Auction 
     */
    public function setOptions(array $options) {

        $methods = get_class_methods($this);

        foreach ($options as $key => $value) {

            $method = 'set' . ucfirst($key);

            if (in_array($method, $methods)) {

                $this->$method($value);
            }
        }
        return $this;
    }
    
    
    
    /**
     * @brief Metoda zwracająca identyfikator aukcji.
     * 
     * @return int 
     */
    public function getAuction_id() {
        return $this->_Auction_id;
    }
    /**
     * @brief Metoda ustawiająca identyfikator aukcji.
     * 
     * @param int $_Auction_id 
     */
    public function setAuction_id($_Auction_id) {
        $this->_Auction_id = $_Auction_id;
    }
    /**
     * @brief Metoda zwracająca nazwę jednostki rynkowej zakładającej aukcję.
     * 
     * @return string 
     */
    public function getMarketEntity_id() {
        return $this->_MarketEntity_id;
    }
    /**
     * @brief Metoda do ustawiania nazwy jednostki rynkowej zakładającej aukcję.
     * 
     * @param string $_MarketEntity_id 
     */
    public function setMarketEntity_id($_MarketEntity_id) {
        $this->_MarketEntity_id = $_MarketEntity_id;
    }
    /**
     * @brief Metoda zwracająca tytuł aukcji.
     * 
     * @return string
     */
    public function getTitle() {
        return $this->_title;
    }
    /**
     * @brief Metoda do ustawiania tytułu aukcji.
     * 
     * @param string $_title 
     */
    public function setTitle($_title) {
        $this->_title = $_title;
    }
    /**
     * @brief Metoda zwracająca opis aukcji.
     * 
     * @return string
     */
    public function getDescription() {
        return $this->_description;
    }

    /**
     * @brief Metoda do ustawiania opisu aukcji.
     * 
     * @param string $_description 
     */
    public function setDescription($_description) {
        $this->_description = $_description;
    }
    /**
     * @brief Metoda zwracająca datę i czas początku aukcji.
     * 
     * @return string w różnych formatach w zależności od zastosowania 
     */
    public function getStartTime() {
        return $this->_startTime;
    }
    /**
     * @brief Metoda do ustawianidaty i czasu początku aukcji.
     * 
     * @param string $_startTime 
     */
    public function setStartTime($_startTime) {
        $this->_startTime = $_startTime;
    }
    /**
     * @brief Metoda zwracająca datę  i czas końca aukcji.
     * 
     * @return string w różnych formatach w zależności od zastosowania 
     */
    public function getEndTime() {
        return $this->_endTime;
    }
    /**
     * @brief Metoda do ustawiania daty i czasu końca aukcji.
     * .z
     * @param string $_endTime 
     */
    public function setEndTime($_endTime) {
        $this->_endTime = $_endTime;
    }
    /** 
     * @brief Metoda zwracająca meta-informację o widoczności ofert.
     * 
     * @return int 
     */
    public function getHiddenOffers() {
        return $this->_hiddenOffers;
    }
    /**
     * @brief Metoda do ustawiania meta-informacji o widoczności ofert.
     * 
     * @param int $_hiddenOffers 
     */
    public function setHiddenOffers($_hiddenOffers) {
        $this->_hiddenOffers = $_hiddenOffers;
    }
    /**
     * @brief Metoda zwracająca ofertę wyjściową.
     * 
     * Jeżeli pole oferty wyjściowej jest puste, wykorzystana zostanie
     * metoda setStartingOffer do jego uzupełnienia, a następnie 
     * zostanie zawartość pola.
     * 
     * @return Application_Model_Offer  
     */
    public function getStartingOffer() {
        if($this->_StartingOffer == NULL){
            try {
                $this->setStartingOffer();
            } catch (Exception $exc) {
                echo $exc->getMessage();
            }
        }
        return $this->_StartingOffer;
    }
    /**
     * @brief Metoda ustawiająca pole na wyjściową ofertę.
     */
    public function setStartingOffer() {
        $mapper = new Application_Model_OfferMapper();
        if($this->_Auction_id == NULL) throw new Exception('Nie można uzyskać ofert bazowej na tym obiekcie');
        $Offers = $mapper->fetchAll('Auction_id ='.$this->_Auction_id.' and firstOffer = 1');
        $this->_StartingOffer = current($Offers);
    }
    /**
     * @brief Metoda zwracająca tablice ofert.
     * 
     * Jeżeli pole na oferty jest puste, wykorzystania zostanie
     * metoda, które je uzupełni. Następnie zostanie zwrócona
     * zawartość pola.
     * 
     * @return Tablica obiektów Application_Model_Offer albo pusta tablica
     */
    public function getOffers() {
        if($this->_Offers == NULL){
            try {
                $this->setOffers();
            } catch (Exception $exc) {
                echo $exc->getMessage();
            }
        }
        return $this->_Offers;
    }
    /**
     * @brief Metoda ustawiajaca pole na oferty.
     */
    public function setOffers() {
       $mapper = new Application_Model_OfferMapper();
       if($this->_Auction_id == NULL) throw new Exception('Nie można uzyskać powiązanych ofert na tym obiekcie');
       $Offers = $mapper->fetchAll('Auction_id ='.$this->_Auction_id.' and firstOffer = 1');
       $this->_Offers = $Offers;
    }

    /**
     * @brief Metoda zliczająca liczbe ofert w aukcji.
     * 
     * Metoda pomija oferte wyjściową
     * @return int
     */
    public function countOffers() {
        $mapper = new Application_Model_OfferMapper();
        $query = 'Auction_id = '.$this->_Auction_id.' and firstOffer = 1'; 
        $count = $mapper->count($query);
        return $count;
        
    }
    
    /**
     * @brief Metoda zwracająca informacje o zapisie wynikow w bazie danych
     * 
     * @return bool true jak zapisane, false w przeciwnym wypadku
     */
    public function getIsVisible() {
        return $this->_isVisible;
    }

    public function setIsVisible($_isVisible) {
        $this->_isVisible = $_isVisible;
    }

    /**
     * @brief Metoda zwracająca datę  i czas końca aukcji.
     * 
     * @return string w różnych formatach w zależności od zastosowania 
     */
    public function getDuration() {
        return $this->_duration;
    }

    public function setDuration($_duration) {
        $this->_duration = $_duration;
    }

    
}

